package com.legal.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
import java.util.Map;

public class JwtUtils {

//    private static String signKey = "XiaoPeng"; //设置签名密钥

    // 方案1：使用足够长度的字符串密钥（32字符=256位）
    private static final String SECRET_KEY = "XiaoPengLegalAssistant2025SecureKey123!";
    private static final Key SIGN_KEY = new SecretKeySpec(
            SECRET_KEY.getBytes(StandardCharsets.UTF_8),
            "HmacSHA256"
    );

    private static Long expire = 43200000L; //设置令牌过期时间为12h

    /**
     * 生成JWT令牌
     *
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims) {
        return Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, SIGN_KEY)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
    }

    /**
     * 解析JWT令牌
     *
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt) {
        try {
            return Jwts.parser()
                    .setSigningKey(SIGN_KEY)
                    .parseClaimsJws(jwt)
                    .getBody();
        } catch (ExpiredJwtException e) {
            System.err.println("Token 已过期: " + e.getMessage());
        } catch (MalformedJwtException e) {
            System.err.println("Token 格式错误: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("解析 Token 失败: " + e.getMessage());
        }
        return null;
    }

    /**
     * 验证并解析JWT令牌
     *
     * @param jwt JWT令牌
     * @return 如果令牌有效则返回payload内容
     * @throws Exception 如果令牌过期、签名不匹配等
     */
    public static Claims validateJwt(String jwt) throws Exception {
        try {
            return Jwts.parser()
                    .setSigningKey(SIGN_KEY)
                    .parseClaimsJws(jwt)
                    .getBody();
        } catch (Exception e) {
            // 可以记录日志或做进一步处理
            throw new Exception("无效的JWT令牌: " + e.getMessage());
        }
    }

    /**
     * 验证JWT令牌是否有效（不抛出异常版本）
     *
     * @param jwt JWT令牌
     * @return 如果令牌有效返回true，否则返回false
     */
    public static boolean isJwtValid(String jwt) {
        try {
            Jwts.parser().setSigningKey(SIGN_KEY).parseClaimsJws(jwt);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
